#!/bin/bash

# ================= configure的具体参数 =================
home_dir="{[{InstallDir}]}/zabbix_proxy"
exconf="--enable-proxy --with-net-snmp --with-mysql --with-ssh2"
# ===================== 到这里结束 =====================

# Centos 7和6不同版本的yum包不同：
yum_diff7_1="mysql-community-devel"
yum_diff6_1="mysql-devel"
function CentosV()
{
    CentosVersion=`sed 's/.* \([0-9]\)\..*/\1/g' /etc/centos-release`
    if [ $CentosVersion == 7 ] 
    then
        echo CentOS 7
        diff_1="$yum_diff7_1"
    elif [ $CentosVersion == 6 ] 
    then
        echo CentOS 6
        diff_1="$yum_diff6_1"
    fi
}
# =============== 安装必需的参数 ===============
CentosV
rootdir=`pwd`
filename="{[{FileName}]}"
installFile="$rootdir/download/$filename"
wgeturl="-P $rootdir/download http://iso.kratosmax.xyz/$filename"
user="zabbix"
yum_list=(gcc net-snmp net-snmp-devel libssh2-devel libevent libevent-devel $diff_1)
configure="./configure --prefix=$home_dir $exconf"
logsdir="zabbix_proxy_logs"
install_log="$rootdir/zabbix_proxy_install.log"
installtime=$(date "+%Y%m%d_%H%M%S")
make_access="$logsdir/zabbix_proxy_make_access_$installtime"
make_error="$logsdir/zabbix_proxy_make_error_$installtime"
install_access="$logsdir/zabbix_proxy_install_access_$installtime"
install_error="$logsdir/zabbix_proxy_install_error_$installtime"
conflog="$logsdir/zabbix_proxy_conf_$installtime"
function getVersion(){
    InstallVersion=`echo $installFile | sed 's/.*\(.abbix.*\).tar.gz/\1/g'`
}
# =============== 到这里结束 ===============

# =============== Mysql参数 ===============
mysql="{[{InstallDir}]}/mysql/bin/mysql"
login="-u root -pmysql"
socket="{[{InstallDir}]}/mysql/run/mysql.sock"
mysql_login="$mysql $login -S $socket"
# =============== Mysql参数 ===============


# =============== init.d参数 ===============
init_name="zabbix_proxy"
initsh="$rootdir/res/${init_name}_init.sh"
pidfile="/tmp/zabbix_proxy.pid"
confdir="$home_dir/etc/zabbix_proxy.conf"
scripts="$home_dir/sbin/zabbix_proxy"


helplist="= = = = = = = = = 帮助 = = = = = = = = =
 -f/--file          指定源tar文件(默认为$installFile)
 -h/--help          帮助文档
 --init             仅生成init.d脚本
 --mysql            导入数据库
 install/--install  安装$InstallVersion并生成/etc/init.d/$init_name"

Params=$@

# 捕捉Ctrl+C
trap 'onCtrlC' INT

function onCtrlC (){
    echo 用户退出脚本,日志记录:$install_log
    exitscripts 20
}

# 无需控制的变量
listlen=${#yum_list[@]}

source res/echo_log.sh

function exitscripts(){
    case $1 in
        1)
            echo -e "\033[41;37m下载失败\033[0m" 
            echo_log 3 "$wgeturl 下载失败"
            exit $1
        ;;
        2)
            echo -e "下载完成，文件保存在当前目录下，请重新指定" 
            echo_log 2 "$wgeturl 下载完成，文件保存在当前目录下，请重新指定"
            exit $1
        ;;
        3)
            echo -e "yum安装失败" 
            echo_log 3 "yum安装失败"
            exit $1
        ;;
        5)
            echo -e "$initsh文件不存在" 
            echo_log 3 "$initsh文件不存在"
            exit $1
        ;;
        6)
            echo -e "make install失败"
            echo_log 3 "make install失败"
            exit $1
        ;;
        7)
            echo -e "无有效参数被指定，请参考帮助：\n$helplist"
            exit $1
        ;;
        8)
            echo -e "\033[41;37m编译失败，查看日志：$make_access和$make_error\033[0m"
            echo_log 3 编译失败，查看日志：$make_access和$make_error
            exit $1
        ;;
        9)
            echo -e "\033[41;37mconfigure失败\033[0m"
            echo_log 3 configure失败 ：$configure
            exit $1
        ;;
        20)
            echo -e "\n\n==========退出脚本：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
            echo_log 3 "用户退出脚本"
            exit $1
        ;;
        *) echo "[error code: \$1 ]"
        ;;
    esac
}

# 检查文件是否存在
function fileexist()
{
    if [ ! -e $1 ];then
        echo -e "\033[43;37m 文件 $1 不存在，开始下载:$wgeturl \033[0m"
	echo_log 3 "文件 $1 不存在，开始下载:$wgeturl"
        rpm -q wget
        wgetres=$?
    else
        return 0
    fi
    if [ $wgetres -ne 0 ];then
        yum -y install wget && exitscripts 3
        echo 安装wget完成
        echo_log 1 安装wget完成
    fi
    wget $wgeturl || exitscripts 1
    echo -e "\n\n==========重新开始脚本：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
    AllParams $Params
}

# 安装编译需要的环境和创建用户
function installEnv(){
    yum_install_res=`yum -y install ${yum_list[*]}`
    echo_log 0 "$yum_install_res"
    id $user
    if [ $? -ne 0 ];then
        useradd $user
        echo 创建$user用户
        echo_log 1  创建用户:$user
    else
        echo_log 0  用户:$user已存在
    fi
}

# 检查环境
function checkEnv(){
    echo -e "\033[44;37m环境包一共：$listlen 个\033[0m"
    EnvReady=0
    res=256
    for item in ${yum_list[*]}
    do
        rpm -q $item
        if [ $? -ne 0 ];then
            yum -y install $item
            res=$?
        else
            ((EnvReady++))
        fi
        if [ $res -eq 256 ];then
            echo "√"
        elif [ $res -eq 0 ];
        then
            echo_log 2 "检查发现$item未安装，重装成功"
            echo -e "检查发现$item未安装，重装成功" 
        else
            echo_log 3 "检查发现$item未安装，且重装失败"
            echo -e "\033[41;37m检查发现$item未安装，且重装失败\033[0m" 
        fi
    done
}

# 解压文件
function unarchive(){
    getVersion
    if [ ! -d zabbix_proxy ];then
        tar -xf $installFile && mv $InstallVersion zabbix_proxy && echo  -e "\033[42;37m解压完成\033[0m" &&   echo_log 1 解压完成
    else
        echo -e "\033[44;37mzabbix_proxy目录已存在，跳过解压\033[0m"
        echo_log 0 zabbix_proxy目录已存在，跳过解压
    fi
}

# 配置、编译、安装
function makeinstall(){
    cd zabbix_proxy
    mkdir -p $logsdir
    echo -e "\033[44;37m开始编译\033[0m"
    if [ -f "Makefile" ]
    then
        make -j8 > $make_access 2> $make_error
        if [ $? -ne 0 ];then
            exitscripts 8
        else
            echo_log 1 编译成功
        fi
        echo "make完成"
    else
        $configure > $conflog || exitscripts 9
        echo_log 1 "./configure完成"
        echo "./configure完成"
        make -j8 > $make_access 2> $make_error || exitscripts 8
         echo_log 1 "make完成"
        echo "make完成"
        echo_log 1 配置、编译成功
    fi
    echo -e "\033[42;37m编译结束，日志：$make_access和$make_error\033[0m"

    echo -e "\033[44;37m开始安装\033[0m"
    make install -j8 > $install_access 2> $install_error || exitscripts 6
    echo_log 1 "make isntall成功"
    echo -e "\033[42;37m安装结束，日志：$install_access和$install_error\033[0m"
}

function ToMysql()
{
    $mysql_login -e "create database zabbix_proxy character set utf8;" && echo "create database zabbix_proxy character set utf8;"
    $mysql_login -e "grant all on zabbix_proxy.* to zabbix@localhost identified by 'zabbix';" && echo "grant all on zabbix_proxy.* to zabbix@localhost identified by 'zabbix';"
    $mysql_login --database zabbix_proxy < $rootdir/zabbix_proxy/database/mysql/schema.sql
    echo "mysql... --database zabbix_proxy < $rootdir/zabbix_proxy/database/mysql/schema.sql"
}
# ======================= 下面是生成init.d的函数 =======================
source $initsh || exitscripts 5
function init_scripts(){
    echo -e "==========生成init.d脚本：$(date "+%Y-%m-%d %H:%M:%S")==========\n\n" >> $install_log
    echofile
    echo_log 1 "生成init.d脚本：init_$init_name"
    chmod +x init_$init_name
    echo_log 1 "给予可执行权限：init_$init_name"
    cp init_$init_name /etc/init.d/$init_name
    echo_log 1 "复制至：/etc/init.d/$init_name"
    echo -e "\033[42;37m生成结束：/etc/init.d/$init_name\033[0m"
    echo -e "\n\n==========生成结束：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
    exit 0
}
# ======================= 上面是生成init.d的函数 =======================

# 参数指定
function AllParams(){
    i=0
    for param in $@
    do
        params[$i]="$param"
        ((i++))
    done
    if [ ${#params[@]} -eq 0 ] 
    then
        exitscripts 7
    fi
    # 将参数都遍历一次，判断是否有其他参数
    i=0
    while [ $i -lt ${#params[@]} ]
    do
        case ${params[i]} in
            -f|--file)
                installFile="${params[i+1]}"
                echo_log 0  参数：installFile=$installFile
                ((i++))
            ;;
            -h|--help)
                echo -e "$helplist" && exit 0
            ;;
            --init)
                init_scripts
            ;;
            install|--install)
                startinstall
            ;;
            --mysql)
                ToMysql
            ;;
            *)
            ;;
        esac
        ((i++))
    done
}

# ========================== 安装开始 ==========================
startinstall(){
    echo -e "==========开始脚本：$(date "+%Y-%m-%d %H:%M:%S")==========\n\n" >> $install_log
    getVersion
    echo_log 0 版本：$InstallVersion

    installEnv

    for((i=0;i<5;i++));
    do
        echo 第$((i+1))次检查：
        checkEnv
        if [ ${EnvReady} -eq $listlen ] 
        then
            echo -e "\033[42;37m一共有${EnvReady}/$listlen个环境已被安装\033[0m"
            echo_log 0 第$((i+1))次检查：一共有${EnvReady}/$listlen个环境已被安装
            clear
            break 
        fi
        echo -e "\033[41;37m一共有${EnvReady}/$listlen个环境已被安装\033[0m"
        echo_log 3 第$((i+1))次检查：一共有${EnvReady}/$listlen个环境已被安装
    done

    echo -e "\033[44;37m编译的版本为：$InstallVersion\033[0m"
    fileexist $installFile
    unarchive

    makeinstall
    echo "日志记录:$install_log"
    echo -e "\n\n==========安装结束：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
    init_scripts
}
AllParams $Params
# ========================== 安装结束 ==========================



